home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / sbin / nessus-mkcert < prev    next >
Text File  |  2006-06-13  |  12KB  |  486 lines

  1. #!/bin/sh
  2. #
  3. # nessus-mkcert
  4. #
  5. # Written by Renaud Deraison <deraison@cvs.nessus.org> 
  6. # and Michel Arboi <arboi@alussinan.org>
  7. #
  8. # This script is distributed under the Gnu General Public License (GPL)
  9. #
  10.  
  11. case `echo -n` in
  12. \-n)    Xn=   ; Xc='\c' ;;
  13. *)    Xn=-n ; Xc=
  14. esac
  15.  
  16.  
  17.  
  18. test "$1" = "-q" && QUIET=y
  19.  
  20.  
  21. echo_no_nl ()
  22. {
  23.     echo $Xn "$*$Xc"
  24. }
  25.  
  26.  
  27. header()
  28. {
  29. clear
  30. echo "-------------------------------------------------------------------------------"
  31. echo "            Creation of the Nessus SSL Certificate"
  32. echo "-------------------------------------------------------------------------------"
  33. echo
  34. }
  35. #
  36. umask 022
  37.  
  38. prefix=/usr
  39. datadir=/usr/share
  40. sysconfdir=/etc
  41. localstatedir=/var/lib
  42. sharedstatedir=${prefix}/com
  43. sbindir=${prefix}/sbin
  44. bindir=${prefix}/bin
  45. egdpath=
  46. is_cygwin=
  47.  
  48. RANDFLAG=""
  49. test -n "$egdpath" && 
  50. {
  51.  RANDFLAG="-rand $egdpath"
  52. }
  53.  
  54.  
  55.  
  56.  
  57.  
  58. PATH=$PATH:$sbindir:$bindir:/usr/ssl/bin:/usr/local/ssl/bin:/opt/ssl/bin
  59.  
  60.  
  61.  
  62.  
  63.  
  64. if [ -z "$is_cygwin" ];
  65. then
  66. #
  67. # We need root priv
  68. #
  69. case `id 2>/dev/null` in 
  70. uid=0*) 
  71.     $sbindir/nessusd -g || {
  72.     echo "Executing nessusd failed. Make sure your library loader is configured properly"
  73.     echo "and that nessusd is in your \$PATH"
  74.     exit 1
  75.     }
  76.     ;; 
  77. *)
  78.     echo "Only root can use nessus-mkcert"
  79.     exit 1
  80. esac
  81. fi
  82.  
  83. #
  84. # We need openssl
  85. #
  86. case `openssl version` in 
  87.  OpenSSL*)
  88.      ;;
  89.  *)
  90.    echo "OpenSSL is not properly installed (the 'openssl' command line utility could not"
  91.    echo "be found (is your \$PATH set properly ?)"
  92.    exit 1
  93. esac
  94.      
  95. NESSUSPRIV="$localstatedir/nessus/CA"
  96. NESSUSPUB="$sharedstatedir/nessus/CA"
  97. if [ ! -d "$NESSUSPRIV" ]; then
  98.     mkdir -p "$NESSUSPRIV"
  99.     chmod 0700 "$NESSUSPRIV"
  100.     echo "$NESSUSPRIV created"
  101. fi
  102.  
  103. if [ ! -d "$NESSUSPUB" ]; then
  104.     mkdir -p "$NESSUSPUB"
  105.     chmod a+rx "$NESSUSPUB"
  106.     echo "$NESSUSPUB created"
  107. fi
  108.  
  109.  
  110. # Check environment
  111. if [ -z "$HOME" ]; then
  112.     echo "HOME should be defined" 1>&2; exit 1
  113. fi
  114.  
  115.  
  116. #
  117. # If EGD is not installed, we have to rely on other sources
  118. # of entropy
  119. test -z "$RANDFLAG" -a -z "$RANDFILE" &&
  120. {
  121.  if [ ! -r /dev/random -a ! -r /dev/urandom -a ! -r $HOME/.rnd ];
  122.   then
  123.    header
  124.    echo "You do not have any suitable random source"
  125.    echo "You will be asked to type a few random keys on your keyboard"
  126.    echo "to generate random bytes"
  127.    nessus-mkrand $HOME/.rnd 1024 
  128.    echo "Press [ENTER] to continue..."
  129.   fi
  130. }
  131.  
  132.  
  133.  
  134. umask 077
  135.  
  136. # Set environment
  137. BASEDIR=${TMPDIR-/tmp}/nessus-mkcert.$$
  138. mkdir $BASEDIR || exit 1
  139.  
  140.  
  141. CAKEY=$NESSUSPRIV/cakey.pem
  142. CACERT=$NESSUSPUB/cacert.pem
  143. #
  144. SRVKEY=$NESSUSPRIV/serverkey.pem
  145. SRVREQ=$BASEDIR/serverreq.pem
  146. SRVCERT=$NESSUSPUB/servercert.pem
  147. #
  148.  
  149. # The client part will be implemented later on...
  150. #cln CLNKEY=$BASEDIR/clientkey.pem
  151. #cln CLNREQ=$BASEDIR/clientreq.pem
  152. #cln CLNCERT=$BASEDIR/clientcert.pem
  153.  
  154.  
  155. if [ -z "$QUIET" ];
  156. then
  157. header
  158. echo "This script will now ask you the relevant information to create the SSL"
  159. echo "certificate of Nessus. Note that this information will *NOT* be sent to"
  160. echo "anybody (everything stays local), but anyone with the ability to connect to your"
  161. echo "Nessus daemon will be able to retrieve this information."
  162. echo
  163. echo
  164. #
  165. echo_no_nl "CA certificate life time in days [1460]: "; read x
  166. CACERT_LIFETIME=${x:-1460}
  167. echo_no_nl "Server certificate life time in days [365]: "; read x
  168. SRVCERT_LIFETIME=${x:-365}
  169. #cln echo_no_nl "Client certificate life time in days [365]:"; read x
  170. #cln CLNCERT_LIFETIME=${x:-365}
  171.  
  172. if [ ! -z "$LANG" ]; then
  173.     DC=`echo $LANG | sed -n 's/^..*_\(..\)$/\1/p'`
  174. fi
  175.  
  176. # Default country = France
  177. # Too bad for you, but quicker for my tests!
  178. echo_no_nl "Your country (two letter code) [${DC:=FR}]: "; read x
  179. COUNTRY=${x:-$DC}
  180. #
  181. echo_no_nl "Your state or province name [none]: "; read x
  182. PROVINCE=${x:-.}
  183. X=Paris; echo_no_nl "Your location (e.g. town) [$X]: "; read x
  184. LOCATION=${x:-$X}
  185. X="Nessus Users United"; echo_no_nl "Your organization [$X]: "; read x
  186. ORGANIZATION=${x:-$X}
  187. # X="Test unit"; echo_no_nl "Your organization unit [$X]:"; read x
  188. # ORGUNIT=${x:-$X}
  189.  
  190. ####
  191. else 
  192. CACERT_LIFETIME="1460"
  193. SRVCERT_LIFETIME="365"
  194. COUNTRY="FR"
  195. PROVINCE="none"
  196. LOCATION="Paris"
  197. ORGANIZATION="Nessus Users United"
  198. fi
  199.  
  200.  
  201. cat <<EOF>$BASEDIR/std000.cnf
  202. RANDFILE        = $HOME/.rnd
  203. #
  204. [ ca ]
  205. default_ca = NessusCA
  206.  
  207. [ NessusCA ]
  208. dir        = $BASEDIR        # Where everything is kept
  209. certs        = \$dir            # Where the issued certs are kept
  210. crl_dir        = \$dir            # Where the issued crl are kept
  211. database    = \$dir/index.txt    # database index file.
  212. new_certs_dir    = \$dir            # default place for new certs.
  213.  
  214. certificate    = $CACERT         # The CA certificate
  215. serial        = \$dir/serial         # The current serial number
  216. crl        = \$dir/crl.pem     # The current CRL
  217. private_key    = $CAKEY        # The private key
  218.  
  219. x509_extensions    = usr_cert        # The extentions to add to the cert
  220. crl_extensions    = crl_ext
  221.  
  222. default_days    = 365        # how long to certify for
  223. default_crl_days= 30            # how long before next CRL
  224. default_md    = md5            # which md to use.
  225. preserve    = no            # keep passed DN ordering
  226.  
  227. policy        = policy_anything
  228.  
  229. [ policy_anything ]
  230. countryName             = optional
  231. stateOrProvinceName     = optional
  232. localityName            = optional
  233. organizationName        = optional
  234. organizationalUnitName  = optional
  235. commonName              = supplied
  236. emailAddress            = optional
  237.  
  238. [ req ]
  239. default_bits        = 1024
  240. distinguished_name    = req_distinguished_name
  241. # attributes        = req_attributes
  242. x509_extensions    = v3_ca    # The extentions to add to the self signed cert
  243.  
  244. [ req_distinguished_name ]
  245. countryName            = Country Name (2 letter code)
  246. countryName_default        = FR
  247. countryName_min            = 2
  248. countryName_max            = 2
  249.  
  250. stateOrProvinceName        = State or Province Name (full name)
  251. stateOrProvinceName_default    = Some-State
  252.  
  253. localityName            = Locality Name (eg, city)
  254.  
  255. 0.organizationName        = Organization Name (eg, company)
  256. 0.organizationName_default    = Internet Widgits Pty Ltd
  257.  
  258. # we can do this but it is not needed normally :-)
  259. #1.organizationName        = Second Organization Name (eg, company)
  260. #1.organizationName_default    = World Wide Web Pty Ltd
  261.  
  262. organizationalUnitName        = Organizational Unit Name (eg, section)
  263. #organizationalUnitName_default    =
  264.  
  265. commonName            = Common Name (eg, your name or your server\'s hostname)
  266. commonName_max            = 255
  267.  
  268. emailAddress            = Email Address
  269. emailAddress_max        = 255
  270.  
  271. # SET-ex3            = SET extension number 3
  272.  
  273. [ usr_cert ]
  274. # These extensions are added when 'ca' signs a request.
  275. # This goes against PKIX guidelines but some CAs do it and some software
  276. # requires this to avoid interpreting an end user certificate as a CA.
  277. #basicConstraints=CA:FALSE
  278.  
  279. # Here are some examples of the usage of nsCertType. If it is omitted
  280. # the certificate can be used for anything *except* object signing.
  281.  
  282. # This is OK for an SSL server.
  283. # nsCertType            = nsCertType
  284. # For normal client use this is typical
  285. # nsCertType = client, email
  286. nsCertType            = NSCERTTYPE
  287.  
  288. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  289.  
  290. # This will be displayed in Netscape's comment listbox.
  291. nsComment            = "OpenSSL Generated Certificate"
  292.  
  293. # PKIX recommendations harmless if included in all certificates.
  294. subjectKeyIdentifier=hash
  295. authorityKeyIdentifier=keyid,issuer:always
  296.  
  297. # This stuff is for subjectAltName and issuerAltname.
  298. # Import the email address.
  299. subjectAltName=email:copy
  300.  
  301. # Copy subject details
  302. issuerAltName=issuer:copy
  303.  
  304. #nsCaRevocationUrl        = http://www.domain.dom/ca-crl.pem
  305. #nsBaseUrl
  306. #nsRevocationUrl
  307. #nsRenewalUrl
  308. #nsCaPolicyUrl
  309. #nsSslServerName
  310.  
  311. [ v3_ca ]
  312. # PKIX recommendation.
  313. subjectKeyIdentifier=hash
  314. authorityKeyIdentifier=keyid:always,issuer:always
  315.  
  316. # This is what PKIX recommends but some broken software chokes on critical
  317. # extensions.
  318. basicConstraints = critical,CA:true
  319. # So we do this instead.
  320. #basicConstraints = CA:true
  321.  
  322. # Key usage: this is typical for a CA certificate. However since it will
  323. # prevent it being used as an test self-signed certificate it is best
  324. # left out by default.
  325. keyUsage = cRLSign, keyCertSign
  326. nsCertType = sslCA
  327. EOF
  328.  
  329. #####
  330.  
  331. sed 's/NSCERTTYPE/server/g' < $BASEDIR/std000.cnf > $BASEDIR/std.cnf
  332. sed 's/NSCERTTYPE/client/g' < $BASEDIR/std000.cnf > $BASEDIR/stdC.cnf
  333. hostname=`hostname`
  334. if [ -z "$hostname" ];
  335. then
  336.  echo "An error occured while trying to determine hostname !"
  337.  exit 1
  338. fi
  339. # The value for organizationalUnitName must be 64 chars or less;
  340. #   thus, hostname must be 36 chars or less. If it's too big,
  341. #   try removing domain.
  342.  
  343. hostname_len=`echo $hostname| wc -c`
  344.  
  345. if [ $hostname_len -gt 36 ];
  346. then
  347.   hostname=`echo $hostname | cut -d '.' -f 1`
  348. fi
  349.  
  350. CAMAIL=ca@$hostname
  351. #cln CLNMAIL=nessus@$hostname
  352. SRVMAIL=nessusd@$hostname
  353. #
  354. # Create the root CA
  355. #
  356.  
  357.  
  358. echo 01 > $BASEDIR/serial
  359. touch $BASEDIR/index.txt
  360. openssl genrsa $RANDFLAG -out $CAKEY  1024 2> $BASEDIR/openssl-log
  361.  
  362.  
  363. echo "$COUNTRY
  364. $PROVINCE
  365. $LOCATION
  366. $ORGANIZATION
  367. Certification Authority for $hostname
  368. $hostname
  369. $CAMAIL" | 
  370. openssl req -config $BASEDIR/std.cnf -new -x509 -days $CACERT_LIFETIME -key $CAKEY -out $CACERT 2>> $BASEDIR/openssl-log
  371.  
  372. # Server key
  373. openssl genrsa $RANDFLAG -out $SRVKEY 1024 2>> $BASEDIR/openssl-log
  374.  
  375. # Server certificate "request"
  376. echo "$COUNTRY
  377. $PROVINCE
  378. $LOCATION
  379. $ORGANIZATION
  380. Server certificate for $hostname
  381. $hostname
  382. $SRVMAIL" | 
  383. openssl req -config $BASEDIR/std.cnf -new -key $SRVKEY -out $SRVREQ 2>> $BASEDIR/openssl-log
  384.  
  385. # Sign the server certificate
  386. openssl ca -config $BASEDIR/std.cnf -name NessusCA -batch -days $SRVCERT_LIFETIME -in $SRVREQ -out $SRVCERT 2>> $BASEDIR/openssl-log
  387.  
  388. #cln # Client key
  389. #cln openssl genrsa -out $CLNKEY 1024
  390.  
  391. #cln # Client certificate "request"
  392. #cln echo "$COUNTRY
  393. #cln $PROVINCE
  394. #cln $LOCATION
  395. #cln $ORGANIZATION
  396. #cln Client certificate for $hostname
  397. #cln $hostname
  398. #cln $CLNMAIL" | 
  399. #cln openssl req -config $BASEDIR/stdC.cnf -new -key $CLNKEY -out $CLNREQ
  400.  
  401. #cln # Sign the client certificate
  402. #cln openssl ca -config $BASEDIR/stdC.cnf -name NessusCA -batch -days $CLNCERT_LIFETIME -in $CLNREQ -out $CLNCERT
  403.  
  404. ####
  405.  
  406.  
  407. chmod a+r $CACERT $SRVCERT #cln $CLNCERT
  408.  
  409.  
  410. CF=/etc/nessus/nessusd.conf
  411. egrep -v '^ *(pem_password|cert_file|key_file|ca_file|force_pubkey_auth) *=' "$CF" > "$CF.tmp"
  412. echo "#
  413. # Added by nessus-mkcert
  414. #
  415. cert_file=$SRVCERT
  416. key_file=$SRVKEY
  417. ca_file=$CACERT
  418. # If you decide to protect your private key with a password, 
  419. # uncomment and change next line
  420. # pem_password=password
  421. # If you want to force the use of a client certificate, uncomment next line
  422. # force_pubkey_auth = yes" >> "$CF.tmp"
  423.  
  424.  
  425.  
  426.  
  427. test -z "$QUIET" && header
  428.  
  429. if [ -s "$CACERT" -a -s "$CAKEY" -a -s "$SRVCERT" -a -s "$SRVKEY" ];
  430.  then
  431.  test -z "$QUIET" && echo "Congratulations. Your server certificate was properly created."
  432.  
  433.  mv -f "$CF.tmp" "$CF"
  434.  test -z "$QUIET" && { 
  435.  echo
  436.  echo "$CF updated
  437.  "
  438.  
  439.  #cln echo "Your client certificates are in $BASEDIR
  440.  #cln You will have to copy them by hand
  441.  
  442.  echo "The following files were created : "
  443.  echo
  444.  echo ". Certification authority : "
  445.  echo "   Certificate = $CACERT"
  446.  echo "   Private key = $CAKEY"
  447.  echo
  448.  echo ". Nessus Server : "
  449.  echo "    Certificate = $SRVCERT"
  450.  echo "    Private key = $SRVKEY"
  451.  #cln ***** Nessus client *****
  452.  #cln Certificate = $CLNCERT
  453.  #cln Private key = $CLNKEY
  454.  }
  455. else
  456.  echo "An error occured while generating the certificates and/or keys !"
  457.  echo
  458.  echo_no_nl "Do you want to save openssl output in a file for further analysis ? (y/n) [y] " $Xc
  459.  read n < /dev/tty
  460.  test -z "$n" -o "$n" = "y" && {
  461.   echo_no_nl "Where should I save this file ? [$HOME/openssl-output] "
  462.   read n < /dev/tty
  463.   test -z "$n" && n="$HOME/openssl-output"
  464.   cp "$BASEDIR"/openssl-log "$n"
  465. }
  466. fi
  467.  
  468.  
  469.  
  470.  
  471. test -z "$QUIET" &&
  472. {
  473.  echo
  474.  echo "Press [ENTER] to exit"; read x
  475. }
  476. rm -rf "$BASEDIR"
  477.  
  478.  
  479. if [ -s "$CACERT" -a -s "$CAKEY" -a -s "$SRVCERT" -a -s "$SRVKEY" ];
  480. then
  481.  exit 0
  482. else
  483.  exit 1
  484. fi
  485.